import axios from "axios";
import {getToken} from "./auth";
import {ElMessage} from "element-plus";

let reqList = [] // 如果某个api存在这个数组里，说明该api暂时无法再次请求
let cancelTime = 100
/**
 * 阻止重复请求
 * @param {array} reqList - 请求缓存列表
 * @param {string} url - 当前请求地址
 * @param {function} cancel - 请求中断函数
 * @param {string} errorMessage - 请求中断时需要显示的错误信息
 */
const stopRepeatRequest = function (reqList, url, cancel, errorMessage) {
  const errorMsg = errorMessage || ''
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      cancel(errorMsg)
      return
    }
  }
  reqList.push(url)
}
/**
 * 允许某个请求可以继续进行
 * @param {array} reqList 全部请求列表
 * @param {string} url 请求地址
 */
const allowRequest = function (reqList, url) {
  for (let i = 0; i < reqList.length; i++) {
    if (reqList[i] === url) {
      reqList.splice(i, 1)
      break
    }
  }
}
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 300000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})
service.defaults.validateStatus = function (status) {
  return status >= 200 && status <= 500; // 默认的
}; // loading框设置局部刷新，且所有请求完成后关闭loading框

service.interceptors.request.use(config => {
  // config.headers[""]
  if (getToken()) {
    config.headers["Authorization"] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  let cancel
  // 设置cancelToken对象
  config.cancelToken = new axios.CancelToken(function (c) {
    cancel = c
  })
  // 阻止重复请求。当上个请求未完成时，相同的请求不会进行
  stopRepeatRequest(reqList, config.url, cancel, `${config.url} 请求被中断`)
  return config
}, error => {
  console.log(error); // for debug
  Promise.reject(error);
})

service.interceptors.response.use(res => {
  const code = res.data.code;
  // 获取错误信息
  const msg = res.data.msg;
  setTimeout(() => {
    allowRequest(reqList, res.config.url)
  }, cancelTime) // 上一次请求返回后过1s才允许再次请求
  if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
    //下载时
    return res.data
  }
  if (code == 200) {
    return res.data
  } else if (code == -1) {
    ElMessage({
      type: "error",
      message: res.data.msg
    })
    return Promise.reject(msg)
  }

}, error => {
  console.log('err' + error)
  if (axios.isCancel(error)) {
    console.log(error.message);
  } else {
    // 增加延迟，相同请求不得在短时间内重复发送
    setTimeout(() => {
      allowRequest(reqList, error.config.url)
    }, cancelTime) // 请求失败返回后过1s才允许再次请求
  }
  return Promise.reject(error)
})

export default service;
